package com.heima.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.heima.annotation.AutoFill;
import com.heima.common.PageResult;
import com.heima.common.Result;
import com.heima.common.constant.StatusConstant;
import com.heima.common.enumeration.OperationType;
import com.heima.mapper.PartnerMapper;
import com.heima.pojo.dto.PartherDto;
import com.heima.pojo.dto.PartherIdDto;
import com.heima.pojo.dto.PartherSearchDto;
import com.heima.pojo.dto.SkuSearchDto;
import com.heima.pojo.entity.Partner;
import com.heima.pojo.vo.PartnerVO;
import com.heima.service.PartnerService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
@Slf4j
public class PartnerServiceImpl extends ServiceImpl<PartnerMapper, Partner> implements PartnerService {


    @Autowired
    private PartnerMapper partnerMapper;

    @Autowired
    private PasswordEncoder passwordEncoder; // 用于加密密码，如 BCrypt

    /**
     * 新增合作商信息
     * @param partherDto
     */
    @Override
    @AutoFill(value = OperationType.INSERT)
    public void setPartner(PartherDto partherDto) {
        Partner parther = new Partner();
        BeanUtils.copyProperties(partherDto,parther);
        parther.setStatus(StatusConstant.ENABLE);


        partnerMapper.insert(parther);

    }

    /**
     * 合作商信息查询
     * @param dto
     * @return
     */
    @Override
    public PageResult<Partner>searchQuery(PartherSearchDto dto) {
        log.info("合作商搜索,{}",dto);

        PageHelper.startPage(dto.getPageIndex(), dto.getPageSize());

        List<Partner> list = partnerMapper.searchQuery(dto);


        PageInfo<Partner> pageInfo = new PageInfo<>(list);

        PageResult<Partner> pageResult = PageResult.<Partner>builder()
                .pageIndex(dto.getPageIndex()) // 当前页码
                .pageSize(dto.getPageSize()) // 每页记录数
                .totalCount(pageInfo.getTotal()) // 总记录数
                .totalPage(pageInfo.getPages()) // 总页数
                .currentPageRecords(pageInfo.getList()) // 当前页记录
                .build();
                return pageResult;


/*        // 创建分页对象
//        PageInfo<PartnerVO> partnerPage = new PageInfo<>(dto.getPageIndex(), dto.getPageSize());

        // 创建查询条件
        LambdaQueryWrapper<Partner> queryWrapper = Wrappers.<Partner>lambdaQuery()
                .eq(dto.getName() != null, Partner::getName, dto.getName());

        // 执行分页查询
//        Page<PartnerVO> page = partnerMapper.selectPage(partnerPage, queryWrapper);


        // 构造PageResult对象
        return PageResult.<PartnerVO>builder()
                .pageIndex(dto.getPageIndex())
                .pageSize(dto.getPageSize())
                .totalCount(page.getTotal()) // 总记录数
                .totalPage((int) page.getPages()) // 总页数
                .currentPageRecords(page.getRecords()) // 当前页记录
                .build();*/



    }

    /**
     * 修改合作商信息
     * @param id
     * @param partnerDto
     */
    @Override
    @AutoFill(value = OperationType.UPDATE)
    public void updatePartner(Integer id, PartherDto partnerDto) {
        Partner partner = new Partner();
        BeanUtils.copyProperties(partnerDto, partner);
        partner.setId(id); // 设置要更新的记录ID
        partnerMapper.updateById(partner);
    }

    @Override
    public boolean resetPassword(Long id) {
        log.info("开始重置合作商密码，ID: {}", id);
        // 1. 查询合作商是否存在
        Partner partner = this.getById(id);
        if (partner == null) {
            log.warn("重置密码失败：合作商ID {} 不存在", id);
            return false;
        }
        log.info("找到合作商：{}", partner.getName());

        // 2. 定义初始密码
        String rawPassword = "123456"; // 可配置为常量或从配置文件读取
        log.info("生成初始密码：{}", rawPassword);

        // 3. 加密密码
        String encodedPassword = passwordEncoder.encode(rawPassword);
        log.info("加密后的密码：{}", encodedPassword);
        // 4. 更新密码
        Partner updatePartner = new Partner();
        updatePartner.setId(Math.toIntExact(id));
        updatePartner.setPassword(encodedPassword);
        log.info("准备更新合作商密码，ID: {}, 新密码：{}", id, encodedPassword);

        boolean success = this.updateById(updatePartner);
        log.info("密码更新结果：{}", success ? "成功" : "失败");

        return success;
    }

}
